# -*- coding = utf-8 -*-
# @Time : 2023/3/11 17:04
# @Author : 龙王赘婿_彪少
# @File : struct_binascii_demo.py
# @Software: PyCharm

# 功能：打包联调
# 思路是，将我们要发送的数据，比如字符串，整数，浮点数，使用struct打包成byte类型的流
# 再将byte流，用binascii打包成ascii码流，之后用串口发送

import struct
import binascii

class Pack:
    __doc__ = []
    __doc__ += ["https://blog.csdn.net/weixin_58439331/article/details/127119632"]

    def doc(self):
        for it in self.__doc__:
            print(it)

    def fun1(self):
        values = (1, 'ab'.encode('utf-8'), 2.7)
        s = struct.Struct('I2sf')
        packed_data = s.pack(*values)

        print('格式符:', s.format)
        print('占用字节:', s.size)
        print('='*120)
        print('原始值:', values)
        print('使用pack打包:', packed_data)
        print('再使用binascii转换:', binascii.hexlify(packed_data))

    def fun2(self):
        packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')
        print(packed_data)
        s = struct.Struct('I2sf')
        unpacked_data = s.unpack(packed_data)
        print('解包结果:', unpacked_data)

    def fun3(self):
        values = (1, 'ab'.encode('utf-8'), 2.7)
        print('原始值:', values)
        # 懂了@要字节对齐，=不用对齐
        # 默认要对齐，且用小端模式
        # 增加大小端后，会按原字节
        # 网络模式与大端模式相同
        # 故要用 @<
        endianness = [
            ('@', '按原字节@'),
            ('=', '按原字节='),
            ('<', '小端模式'),
            ('>', '大端模式'),
            ('!', '网络传输')
        ]
        for code, name in endianness:
            s = struct.Struct(code+'I2sf')
            packed_data = s.pack(*values)
            print('='*120)
            print('格式符  : ', s.format, 'for', name)
            print('占用字节: ', s.size)
            print('使用pack打包:', packed_data)
            print('再使用binascii转换:', binascii.hexlify(packed_data))
            print('解包结果: ', s.unpack(packed_data))

    def __init__(self):
        # self.doc()
        self.fun1()
        # self.fun2()
        self.fun3()


if __name__ == "__main__":
    p = Pack()
